Kubeconfig 文件解释、配置示例

概述

在这篇博客中,您将学习如何使用 Kubeconfig 文件使用不同的方法连接到 kubernetes 集群。此外,您将学习生成自定义 Kubeconfig 文件。

什么是 Kubeconfig 文件?

Kubeconfig 是一个 YAML 文件,其中包含所有 Kubernetes 集群详细信息、证书和用于验证集群的秘密令牌。如果您使用的是托管 Kubernetes 集群,则可以直接从群集管理员或云平台获取此配置文件。

A Kubeconfig is a YAML file with all the Kubernetes cluster details, certificate, and secret token to authenticate the cluster. 

当你使用 时,它会使用 kubeconfig 文件中的信息来连接到 kubernetes 集群 API。Kubeconfig 文件的默认位置是kubectl $HOME/.kube/config

示例 Kubeconfig 文件

下面是一个 Kubeconfig 的示例。它需要以下关键信息才能连接到 Kubernetes 集群。

  1. certificate-authority-data: Cluster CA
  2. server: Cluster endpoint (IP/DNS of master node)
  3. name: Cluster name
  4. user: name of the user/service account.
  5. token: Secret token of the user/service account.
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: <ca-data-here>
    server: https://your-k8s-cluster.com
  name: <cluster-name>
contexts:
- context:
    cluster:  <cluster-name>
    user:  <cluster-name-user>
  name:  <cluster-name>
current-context:  <cluster-name>
kind: Config
preferences: {}
users:
- name:  <cluster-name-user>
  user:
    token: <secret-token-here>

Different Methods to Connect Kubernetes Cluster With Kubeconfig File

你可以用不同的方式使用 Kubeconfig,每种方式都有自己的优先级。这是顺序的优先级。

  1. Kubectl 上下文:Kubeconfig with kubectl 会覆盖所有其他配置。它具有最高的优先级。
  2. 环境变量:KUBECONFIG env 变量覆盖当前上下文。
  3. 命令行参考: 当前上下文的优先级低于内联配置引用和 env 变量。

方法 1:使用 kubeconfig kubectl 上下文连接到 Kubernetes 集群

要连接到 Kubernetes 集群,基本的先决条件是 Kubectl CLI 插件。如果您没有安装 CLI,请按照[此处给出的说明](在 Linux 系统中安装并设置 kubectl | Kubernetes)进行操作

现在按照下面给出的步骤使用 kubeconfig 文件与集群进行交互。

步骤1:将 kubeconfig 移动到 .kube 目录。

Kubectl 使用 Kubeconfig 文件中提供的详细信息与 kubernetes 集群进行交互。默认情况下,kubectl 在该位置查找配置文件。~/.kube

让我们将 kubeconfig 文件移动到 .kube 目录。替换为您的 kubeconfig 当前路径。/path/to/kubeconfig

mv /path/to/kubeconfig ~/.kube

步骤 2:列出所有群集上下文

您可以在目录中拥有任意数量的 kubeconfig。每个配置都有一个唯一的上下文名称(即集群的名称)。您可以通过列出上下文来验证 Kubeconfig 文件。您可以使用以下命令列出所有上下文。它将上下文名称列为群集的名称。.kube

kubectl config get-contexts

步骤 3:设置当前上下文

现在你需要将当前上下文设置为你的 kubeconfig 文件。您可以使用以下命令进行设置。替换为列出的上下文名称。<cluster-name>

kubectl config use-context <cluster-name>  

例如:
kubectl config use-context my-dev-cluster

步骤 4:验证 Kubernetes 群集连接

要验证集群连接,您可以执行以下 kubectl 命令来列出集群节点。

kubectl get nodes

方式二:连接 KUBECONFIG 环境变量

您可以使用文件路径设置环境变量以连接到集群。因此,无论您在终端中使用 kubectl 命令的哪个位置,env 变量都应该可用。如果设置此变量,它将覆盖当前群集上下文。KUBECONFIG kubeconfig KUBECONFIG

您可以使用以下命令设置变量。文件名在哪里。dev_cluster_config kubeconfig

KUBECONFIG=$HOME/.kube/dev_cluster_config

方法 3:使用 kubeconfig 文件和 kubectl

你可以使用 Kubectl 命令传递 Kubeconfig 文件,以覆盖当前上下文和 KUBECONFIG env 变量。

下面是获取节点的示例。

kubectl get nodes --kubeconfig=$HOME/.kube/dev_cluster_config

你也可以使用,

KUBECONFIG=$HOME/.kube/dev_cluster_config kubectl get nodes

合并多个 kubeconfig 文件

可以使用支持的 kubectl 命令将其他 Kubeconfig 文件合并到默认文件中。$HOME/.kube/config

假设在目录$HOME/.kube/中有三个 Kubeconfig 文件。

  1. config (default kubeconfig)
  2. dev_config
  3. test_config

使用以下命令将所有三个配置合并到一个文件中。确保在 $HOME/.kube 目录运行命令

KUBECONFIG=config:dev_config:test_config kubectl config view --merge --flatten > config.new

上面的命令创建一个名为 的合并配置。config.new

现在重命名文件。$HOME.kube/config

mv $HOME/.kube/config $HOME/.kube/config.old
mv $HOME/.kube/config.new $HOME/.kube/config

要验证配置,请尝试列出配置中的上下文。

kubectl config get-contexts

生成 kubeconfig 文件?

一个 kubeconfig 需要以下重要的细节。

  1. Cluster endpoint (IP or DNS name of the cluster)
  2. Cluster CA Certificate
  3. Cluster name
  4. Service account user name
  5. Service account token

注意:要生成 Kubeconfig 文件,您需要在集群中拥有管理员权限才能创建服务账号和角色。

我将创建一个对群集范围资源具有有限访问权限的服务帐户。也可以创建一个普通角色,以限制用户对特定命名空间的访问。

创建 serviceaccount

serviceaccount 名称将是 Kubeconfig 中的用户名。如果要创建配置以授予命名空间级别受限的访问权限,请在所需的命名空间中创建 serviceaccount

kubectl -n kube-system create serviceaccount devops-cluster-admin

创建 ClusterRole

创建一个对群集对象具有有限权限的 ClusterRole 。可以根据需要添加所需 resources 。有关详细信息,请参阅具有群集角色访问的服务帐户博客。clusterRole

如果要创建命名空间范围的 Role ,请参阅使用角色创建服务帐户

执行以下命令创 ClusterRole

cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: devops-cluster-admin
rules:
- apiGroups: [""]
  resources:
  - nodes
  - nodes/proxy
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]
EOF

## apiGroups: "","apps", "autoscaling", "batch", kubectl api-versions
## resources: "services", "pods","deployments"... kubectl api-resources
## verbs: "get", "list", "watch", "create", "update", "patch", "delete", "exec"

创建 ClusterRoleBinding

执行以下命令创建名为devops-cluster-adminClusterRoleBinding ,将 ClusterRole 绑定到 ServiceAccount

如果需要针对不同的 namespace 划分不同的权限,可以创建多个 ClusterRole,在对应的 Namespace 中创建单独的 RoleBinding 绑定 ClusterRoleBinding 和 ServiceAccount

cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: devops-cluster-admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: devops-cluster-admin
subjects:
- kind: ServiceAccount
  name: devops-cluster-admin
  namespace: kube-system
EOF

获取群集详细信息和密钥

检索所有必需的 kubeconfig 信息并将它们保存在变量中。最后,我们将它直接替换为 Kubeconfig YAML。

export SA_TOKEN_NAME=$(kubectl -n kube-system get serviceaccount devops-cluster-admin -o=jsonpath='{.secrets[0].name}')

export SA_SECRET_TOKEN=$(kubectl -n kube-system get secret/${SA_TOKEN_NAME} -o=go-template='{{.data.token}}' | base64 --decode)

export CLUSTER_NAME=$(kubectl config current-context)

export CURRENT_CLUSTER=$(kubectl config view --raw -o=go-template='{{range .contexts}}{{if eq .name "'''${CLUSTER_NAME}'''"}}{{ index .context "cluster" }}{{end}}{{end}}')

export CLUSTER_CA_CERT=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}"{{with index .cluster "certificate-authority-data" }}{{.}}{{end}}"{{ end }}{{ end }}')

export CLUSTER_ENDPOINT=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}{{ .cluster.server }}{{end}}{{ end }}')

使用变量生成 kubeconfig。

执行以下命令,生成 kubeconfig devops-cluster-admin-config

cat << EOF > devops-cluster-admin-config
apiVersion: v1
kind: Config
current-context: ${CLUSTER_NAME}
contexts:
- name: ${CLUSTER_NAME}
  context:
    cluster: ${CLUSTER_NAME}
    user: devops-cluster-admin
clusters:
- name: ${CLUSTER_NAME}
  cluster:
    certificate-authority-data: ${CLUSTER_CA_CERT}
    server: ${CLUSTER_ENDPOINT}
users:
- name: devops-cluster-admin
  user:
    token: ${SA_SECRET_TOKEN}
EOF

验证生成的 Kubeconfig

执行以下命令验证生成的 Kubeconfig。

kubectl get nodes --kubeconfig=devops-cluster-admin-config 

参考

Kubeconfig 文件用实际示例解释 (devopscube.com)